#pragma once
#ifndef _VFADAPTER_H
#define _VFADAPTER_H
#include <afx.h>

#ifdef VFADAPTER
#define VFAdapterAPI extern "C" __declspec(dllexport)
#else
#define VFAdapterAPI extern "C" __declspec(dllimport)
#endif
#include <vector>
#include <mbdTreeNode.h>

namespace VFAdapter {
enum geom_entity_type : int {
  vf_geom_none = -1,
  vf_geom_any = 0,
  vf_vertex = 1,
  vf_curve = 1 << 1,
  vf_face = 1 << 2,
  vf_loop = 1 << 3,
  vf_body = 1 << 4,
  vf_curves = 1 << 5,
  vf_faces = 1 << 6,
};
enum vfHRESULT { vf_Success = 0, vf_Failure = 1, vf_Cancel = 2 };
constexpr int TGC_CODE = 2;
//!
//! @brief 连接CAD
//!
//! @return VFAdapterAPI
//!
VFAdapterAPI vfHRESULT vfStartLinkWithCAD(int iCadType);

//!
//! @brief 由ID取得实体类型
//!
//! @param lID id
//! @param enType 实体类型
//! @return VFAdapterAPI
//!
VFAdapterAPI vfHRESULT vfGetEntityType(const char *inputValueString,
                                       geom_entity_type &);

//!
//! @brief 在CAD中创建点
//!
//! @param x
//! @param y
//! @param z
//! @param ptID 返回的顶点ID
//! @return VFAdapterAPI
//!
VFAdapterAPI vfHRESULT vfCreatePoint(double x, double y, double z,
                                     const char *&ptID);

//!
//! @brief 两条曲线求交
//!
//! @param lCurveTag1  曲线一标识
//! @param lCurveTag2  曲线二标识
//! @param x
//! @param y
//! @param z
//! @param bCreatePoint 是否在交点处创建点
//! @param ptID  如创建点，返回的交点ID
//! @return VFAdapterAPI
//!

VFAdapterAPI vfHRESULT vfCurveCurveIntersection(const char *lCurveTag1,
                                                const char *lCurveTag2,
                                                double &x, double &y, double &z,
                                                const char *&ptID);

//!
//! @brief 曲线与曲面求交
//!
//! @param lCurveTag1  曲线标识
//! @param lSurfaceTag1 曲面标识
//! @param x
//! @param y
//! @param z
//! @param bCreatePoint 是否在交点处创建点
//! @param ptID  如创建点，返回的交点ID
//! @return VFAdapterAPI
//!

VFAdapterAPI vfHRESULT vfCurveSurfaceIntersection(const char *lCurveTag1,
                                                  const char *lSurfaceTag1,
                                                  double &x, double &y,
                                                  double &z, const char *&ptID);

//!
//! @brief 交互式选取单个实体对象
//!
//! @param geoType  实体类型，0则选择任意实体
//! @param tagID    返回的实体标识
//! @param strMessage 提示信息
//! @param bObjectActionParadigmPossibility  是否选择预选对象
//! @return VFAdapterAPI
//!
VFAdapterAPI vfHRESULT vfSelectSingleByInteractive(
    geom_entity_type geoType, int64_t &tagID, wchar_t *strMessage,
    bool bObjectActionParadigmPossibility);

//!
//! @brief 将指定实体加入选择集
//!
//! @param tagID
//! @return VFAdapterAPI
//!
VFAdapterAPI vfHRESULT vfSelectByTag(const char *tagID);

//!
//! @brief 清理选择集
//!
//! @return VFAdapterAPI
//!
VFAdapterAPI vfHRESULT vfClearSeletion();

//!
//! @brief 曲线在曲面上偏置
//!
//! @param curveID1 曲线标识
//! @param surfaceID  曲面标注
//! @param dis  偏移距离(有正负，正表示与曲面法向一致，负表示与曲线法向相反)
//! @param curveID2
//! @return VFAdapterAPI
//!
VFAdapterAPI vfHRESULT vfOffsetCurve(const char *curveID1,
                                     const char *surfaceID, double dis,
                                     const char *&curveID2);

//!
//! @brief 由曲面与曲面求交，返回曲线
//!
//! @param surfaceID1 曲面一标识
//! @param surfaceID2 曲面二标识
//! @param curveID  生成的曲线标识
//! @return VFAdapterAPI
//!

VFAdapterAPI vfHRESULT vfCreateCurveBySurfaceIntersection(
    const char *surfaceID1, const char *surfaceID2, const char *&curveID);

//!
//! @brief 曲面沿法线偏置（无问题）
//!
//! @param surfaceID1 曲面的拓扑ID
//! @param dis 偏置的距离
//! @param surfaceID2 偏置后的曲面的拓扑ID
//! @return VFAdapterAPI
//!

VFAdapterAPI vfHRESULT vfOffsetSurface(const char *surfaceID1,
                                       const char *pointID, double dis,
                                       const char *&surfaceID2);

//!
//! @brief 根据多截面创建曲面(无问题)
//!
//! @param curveIDs
//! @param num
//! @param surfaceID
//! @return VFAdapterAPI
//!
VFAdapterAPI vfHRESULT vfCreateSurfaceByLoft(const char **curveIDs, int num,
                                             const char *&surfaceID);

// 12.多曲面合并
VFAdapterAPI vfHRESULT vfSurfaceMerge(const char **surfaceIDs, int num,
                                      const char *&newSurfaceID); // Yes102

//!
//! @brief 计算曲面面积(无问题)
//!
//! @param surfaceID 曲面的拓扑ID
//! @param dArea 面积
//! @return VFAdapterAPI
//!

VFAdapterAPI vfHRESULT vfSurfaceArea(const char *surfaceID, double &dArea);

//!
//! @brief 计算曲面周长(无问题)
//!
//! @param surfaceID 曲面的拓扑ID
//! @param dPerimeter 周长
//! @return VFAdapterAPI
//!

VFAdapterAPI vfHRESULT vfSurfacePerimeter(const char *surfaceID,
                                          double &dPerimeter);

// 16. 计算曲面质量

VFAdapterAPI vfHRESULT vfSurfaceWeight(const char *surfaceID,
                                       double SurfaceDensity, double &dWeight);

// 17. 对象多选
VFAdapterAPI vfHRESULT vfSelectMul(geom_entity_type geoType, int &ptCnt,
                                   int64_t **pPts, wchar_t *strMessage,
                                   bool bObjectActionParadigmPossibility);

VFAdapterAPI vfHRESULT vfSelectMultiyInteractive(
    int geoType, std::vector<int64_t> &tagIDs, wchar_t *strMessage,
    bool bObjectActionParadigmPossibility); // 多选

//!
//! @brief 镜像创建面（无问题）
//!
//! @param surfaceID1 曲面的拓扑ID
//! @param mirrorPlaneID 镜面的拓扑ID
//! @param bReserved 是否保留被镜像的曲面
//! @param surfaceID2 镜像曲面的ID
//! @return VFAdapterAPI
//!
VFAdapterAPI vfHRESULT vfMirrorSurface(const char *surfaceID1,
                                       const char *mirrorPlaneID,
                                       bool bReserved,
                                       const char *&surfaceID2); // Yes102

//!
//! @brief 曲面上两点创建曲线（第二个点会存在问题）
//!
//! @param pointID1 点的拓扑ID
//! @param pointID2 点的拓扑ID
//! @param surfaceID 曲面的拓扑ID
//! @param curveID 曲线的拓扑ID
//! @return VFAdapterAPI
//!

VFAdapterAPI vfHRESULT vfCreateCurveOnSurfaceByTwoPoints(
    const double *X1, const double *Y1, const double *Z1, const double *X2,
    const double *Y2, const double *Z2, const char *SurfaceID);

//!
//! @brief 镜像创建曲线（无问题）
//!
//! @param curveID1 曲线的拓扑ID
//! @param mirrorPlane 镜面的拓扑ID
//! @param bReserved 是否保留被镜像的曲线
//! @param curveID2 镜像曲线的拓扑ID
//! @return VFAdapterAPI
//!
VFAdapterAPI vfHRESULT vfMirrorCurve(const char *curveID1,
                                     const char *mirrorPlane, bool bReserved,
                                     const char *&curveID2);

//!
//! @brief 通过投影创建线（无问题）
//!
//! @param curveID1 曲线的拓扑ID
//! @param surfaceID 曲面的拓扑ID
//! @param curveID2 投影曲线的拓扑ID
//! @return VFAdapterAPI
//!
VFAdapterAPI vfHRESULT vfCreateCurveByProjection(const char *curveID1,
                                                 const char *surfaceID,
                                                 const char *&curveID2);

// 22.通过样条曲线()
VFAdapterAPI vfHRESULT vfCreateSplineCurve(const char **pointIDs, int num,
                                           bool bControlPt,
                                           const char *&curveID);

//!
//! @brief 通过曲面加厚创建体(无问题)
//!
//! @param surfaceID 曲面的拓扑ID
//! @param thickness 加厚厚度
//! @param direction 曲面加厚方向
//! @param bodyID 加厚体的BodyID
//! @return VFAdapterAPI
//!
VFAdapterAPI vfHRESULT vfCreateBodyWithThickedSurfaceOld(int64_t surfaceID,
                                                         double thickness,
                                                         double *direction,
                                                         int64_t &bodyID);
//!
//! @brief
//!
//! @param surfaceID
//! @param thickness
//! @param direction
//! @param bodyID
//! @return VFAdapterAPI
//!
VFAdapterAPI vfHRESULT vfCreateBodyWithThickedSurface(const char *surfaceID,
                                                      double thickness,
                                                      const char *&bodyID);

// 24. 获取曲面重心

VFAdapterAPI vfHRESULT vfCreateGravityOfSurface(const char *surfaceID,
                                                double &x, double &y,
                                                double &z);

// 25. 测试点是否在曲线上

VFAdapterAPI vfHRESULT vfTestPointOnCurve(const char *pointID,
                                          const char *curveID, bool &bOn);

// 26. 测试点是否在曲面上

//!
//! @brief
//!
//! @param pointID
//! @param surfaceID
//! @param result
//! 若返回0，则点在面外；若返回1，则点在面内；若返回2，则点在面的边界上
//! @return VFAdapterAPI
//!
VFAdapterAPI vfHRESULT vfTestPointOnSurface(const char *pointID,
                                            const char *surfaceID, int &result);

VFAdapterAPI vfHRESULT vfTestPointOnSurface2(double x, double y, double z,
                                             const char *surfaceID,
                                             int &result);

//!
//! @brief 交互地从指定曲面上取点
//!
//! @param surfaceID 曲面ID
//! @param x
//! @param y
//! @param z
//! @return vfHRESULT
//! 如取成功，返回取得点的坐标，否则返回vf_cancel或vf_Failure
//!
VFAdapterAPI vfHRESULT vfMousePtOnSurface(const char *surfaceID, double &x,
                                          double &y, double &z);

//!
//! @brief 镜像特征
//!
//! @param objectID1  特征ID
//! @param mirrorPlane  镜像参考面的ID
//! @param bReserved  是否保留原始特征
//! @param objectID2  镜像后的特征的ID
//! @return vfHRESULT
//!
VFAdapterAPI vfHRESULT vfMirrorObject(const char *objectID1,
                                      const char *mirrorPlane, bool bReserved,
                                      const char *&objectID2);

//!
//! @brief 通过多条曲线复合创建曲线
//!
//! @param curveIDs 曲线集
//! @param num 曲线个数
//! @param bReserved 是否保留原始曲线集
//! @param curveID  复合曲线ID
//! @return vfHRESULT
//!
VFAdapterAPI vfHRESULT vfCreateCurveByMultiCurves(const char **curveIDs,
                                                  int num, bool bReserved,
                                                  const char *&curveID);

//!
//! @brief 修剪曲线
//!
//! @param curveID  原始曲线
//! @param objTrimingID  裁剪对象
//! @param curveID2  裁剪后的曲线
//! @return vfHRESULT
//!
VFAdapterAPI vfHRESULT vfCurveTrim(const char *curveID,
                                   const char *objTrimingID,
                                   const char *&curveID2);
//!
//! @brief 依据曲线上参数创建点
//!
//! @param curveID 曲线ID
//! @param u  曲线参数
//! @param x
//! @param y
//! @param z
//! @param pointID 创建的点的ID
//! @return vfHRESULT
//!
VFAdapterAPI vfHRESULT vfCreatePointOnCurve(const char *curveID, double u,
                                            double &x, double &y, double &z,
                                            const char *&pointID);

//!
//! @brief 依据曲面上参数创建点
//!
//! @param surfaceID 曲面
//! @param u 参数u
//! @param v 参数v
//! @param x
//! @param y
//! @param z
//! @param pointID
//! @return vfHRESULT
//!
VFAdapterAPI vfHRESULT vfCreatePointOnSurface(const char *surfaceID, double u,
                                              double v, double &x, double &y,
                                              double &z, const char *&pointID);

//!
//! @brief 依据方程创建曲线
//!
//! @param cType 坐标类型
//! @param strExpression1
//! @param strExpression2
//! @param strExpression3
//! @param curveID 曲线ID
//! @return vfHRESULT
//!
VFAdapterAPI vfHRESULT vfCreateFunctionCurve(int cType, wchar_t *strExpression1,
                                             wchar_t *strExpression2,
                                             wchar_t *strExpression3,
                                             const char *&curveID);

//!
//! @brief 更改曲线线宽和颜色为指定值，返回原始线宽和颜色
//!
//! @param objectID
//! @param lineWidth
//! @param colorR
//! @param colorG
//! @param colorB
//! @return vfHRESULT
//!
VFAdapterAPI vfHRESULT vfChangeTheColorLineWidth(const char *objectID,
                                                 int32_t *lineWidth,
                                                 int32_t *colorR,
                                                 int32_t *colorG,
                                                 int32_t *colorB);

//!
//! @brief 还原曲线的原始线宽和颜色
//!
//! @param objectID
//! @return vfHRESULT
//!
VFAdapterAPI vfHRESULT vfRestoresColorLineWidth(const char *objectID);

//!
//! @brief 创建坐标系并返回6条边的id
//!
//! @param faceID
//! @param pointID
//! @param lineID
//! @param startAngle
//! @param directionAngle
//! @param segmentLength
//! @param Line1
//! @param Line2
//! @param Line3
//! @param Line4
//! @param Line5
//! @param Line6
//! @return vfHRESULT
//!
VFAdapterAPI vfHRESULT vfCreateRosetteById(
    int64_t faceID, int64_t pointID, int64_t lineID, double startAngle,
    double directionAngle, double segmentLength, bool isRightHandDirection,
    int64_t *RosetteID, int64_t *Line1, int64_t *Line2, int64_t *Line3,
    int64_t *Line4, int64_t *Line5, int64_t *Line6);

//!
//! @brief 删除几何体
//!
//! @param objectID
//! @return vfHRESULT
//!
VFAdapterAPI vfHRESULT vfRemoveTargetObject(const char *objectID);

//!
//! @brief 批量加粗高亮显示拓扑对象
//!
//! @param inputStringValue
//! @return VFAdapterAPI
//!
VFAdapterAPI vfHRESULT
vfChangeLineColorWidthInsertMap(const char *inputStringValue[]);

//!
//! @brief 批量恢复显示
//!
//! @param inputStringValue
//! @return vfHRESULT
//!
VFAdapterAPI vfHRESULT
vfChangeLineColorWidthFromMap(const char *inputStringValue[]);

//!
//! @brief
//!
//! @param faceID
//! @param pointID
//! @param lineID
//! @param startAngle
//! @param directionAngle
//! @param segmentLength
//! @param HandDirection
//! @param RosetteID
//! @param Line1
//! @param Line2
//! @param Line3
//! @param Line4
//! @param Line5
//! @param Line6
//! @return VFAdapterAPI
//!
VFAdapterAPI vfHRESULT
vfCreateRosette(const char *faceID, const char *pointID, const char *lineID,
                double startAngle, double directionAngle, double segmentLength,
                const char *HandDirection, const char *&RosetteID,
                const char *&Line1, const char *&Line2, const char *&Line3,
                const char *&Line4, const char *&Line5, const char *&Line6);

//!
//! @brief
//!
//! @param filterType
//! @param intValue
//! @return vfHRESULT
//!
VFAdapterAPI vfHRESULT vfSelectionToID(const wchar_t *filterType,
                                       char *intValue);

VFAdapterAPI vfHRESULT vfCESHI(const char *inputStringValue[],
                               int32_t *lineWidth, int32_t *colorR,
                               int32_t *colorG, int32_t *colorB);
VFAdapterAPI vfHRESULT vfParameterInput(const char *userInput);
VFAdapterAPI vfHRESULT vfSelectionToIDMore(const wchar_t *filterType,
                                           const char **&outputID);

// 2025.01.19 批新增接口
//!
//! @brief 返回曲线长度
//!
//! @param CurveID
//! @param Length
//! @return VFAdapterAPI
//!
VFAdapterAPI vfHRESULT vfCurveLength(const char *CurveID, double &Length);

/// @brief 创建投影点
/// @param PointID1 给定的空间点
/// @param SurfaceID 待投影平面
/// @param PointID2 如成功投影，返回投影后的点
/// @return
VFAdapterAPI vfHRESULT vfCreatePointByProjection(const char *PointID1,
                                                 const char *SurfaceID,
                                                 const char *&PointID2);
//!
//! @brief 裁剪或分割
//!
//! @param CurveID1
//! @param CurveID2
//! @param CutType 输入为"Split"或"Trim"
//! @param iOrientation1 1为正方向，2为反方向
//! @param iOrientation2 1为正方向，2为反方向
//! @return VFAdapterAPI
//!
VFAdapterAPI vfHRESULT vfCreateSplitOrTrim(const char *CurveID1,
                                           const char *CurveID2,
                                           const char *CutType,
                                           int iOrientation1,
                                           int iOrientation2);

//!
//! @brief 要求返回指定平面上距指定点指定方向上指定测地距离上的点
//!
//! @param surfaceID 给定平面
//! @param pointID1 给定点
//! @param x  给定方向x
//! @param y  给定方向y
//! @param z  给定方向z
//! @param geodesicDis 测地距离
//! @param pointID2 返回的点
//! @return VFAdapterAPI
//!
VFAdapterAPI vfHRESULT vfCreatPointByGeodesicDis(const char *surfaceID,
                                                 const char *pointID1, double x,
                                                 double y, double z,
                                                 double geodesicDis,
                                                 const char *&pointID2);

//!
//! @brief 获取相交曲线
//!
//! @param CurveID
//! @param IntersectCurveID
//! @return VFAdapterAPI
//!
VFAdapterAPI vfHRESULT vfGetIntersectCurve(const char *CurveID,
                                           const char **&IntersectCurveID);

//!
//! @brief 曲面上一点按给定方向到曲面上一曲线的测地距离
//!
//! @param SurfaceID
//! @param CurveID
//! @param PointID
//! @param x
//! @param y
//! @param z
//! @param GeodesicLength
//! @return VFAdapterAPI
//!
VFAdapterAPI vfHRESULT vfGeodesicLengthOfPointToCurve(
    const char *SurfaceID, const char *CurveID, const char *PointID, double x,
    double y, double z, double &GeodesicLength);

//!
//! @brief 计算曲线在某一点的切向单位向量，输入曲线和点ID，输出切线单位向量。
//!
//! @param CurveID
//! @param PointID
//! @param bReverse
//! @param x
//! @param y
//! @param z
//! @return VFAdapterAPI
//!
VFAdapterAPI vfHRESULT vfGetUnitTangentVectorAtPoint(const char *CurveID,
                                                     const char *PointID,
                                                     int bReverse, double &x,
                                                     double &y, double &z);

//!
//! @brief 获取点在曲面的法向的单位向量，
//!
//! @param SurfaceID
//! @param PointID
//! @param bReverse
//! @param x
//! @param y
//! @param z
//! @return VFAdapterAPI
//!

VFAdapterAPI vfHRESULT vfGetUnitNormalVectorAtPoint(const char *SurfaceID,
                                                    const char *PointID,
                                                    bool bReverse, double &x,
                                                    double &y, double &z);

//!
//! @brief 给定基准点坐标、方向和距离求得曲面上点的坐标
//!
//! @param surfaceID
//! @param x
//! @param y
//! @param z
//! @param dirx
//! @param diry
//! @param dirz
//! @param geodesicDis
//! @param outputx
//! @param outputy
//! @param outputz
//! @param result
//! @return VFAdapterAPI
//!
VFAdapterAPI vfHRESULT vfGetPointByGeodesicDis(const char *surfaceID, double x,
                                               double y, double z, double dirx,
                                               double diry, double dirz,
                                               double geodesicDis,
                                               double &outputx, double &outputy,
                                               double &outputz, int &result);

//!
//! @brief
//!
//! @param surfaceID
//! @param pointID1
//! @param x
//! @param y
//! @param z
//! @param geodesicDis
//! @param outputx
//! @param outputy
//! @param outputz
//! @return VFAdapterAPI
//!
VFAdapterAPI vfHRESULT vfCreatPointByGeodesicDis2(
    const char *surfaceID, const char *pointID1, double x, double y, double z,
    double geodesicDis, double &outputx, double &outputy, double &outputz);

//!
//! @brief 输入点ID返回其坐标值
//!
//! @param PointID
//! @param x
//! @param y
//! @param z
//! @return VFAdapterAPI
//!
VFAdapterAPI vfHRESULT vfGetCoordOfPoint(const char *PointID, double &x,
                                         double &y, double &z);

//!
//! @brief 点是否在曲面的范围内（投影）
//!
//! @param SurfaceID
//! @param px
//! @param py
//! @param pz
//! @param dx
//! @param dy
//! @param dz
//! @param result
//! 点相对于曲面的三种情况（若返回0，则点按照输入的方向无法投影到曲面上；若返回1，则点在面内；若返回2，则点在面的边界上）
//! @return VFAdapterAPI
//!
VFAdapterAPI vfHRESULT vfTestPointOnSurfaceByProject(const char *SurfaceID,
                                                     double px, double py,
                                                     double pz, double dx,
                                                     double dy, double dz,
                                                     int &result);
//!
//! @brief
//!
//! @param SurfaceID
//! @param PointID
//! @return VFAdapterAPI
//!
VFAdapterAPI vfHRESULT vfCreateNormalLineAndArrowhead(const char *SurfaceID,
                                                      const char *PointID);

//!
//! @brief 删除点对应的法向线及箭头
//!
//! @param PointID
//! @return VFAdapterAPI
//!
VFAdapterAPI vfHRESULT vfDeleteNormalLineAndArrowhead(const char *PointID);

// 2025.03.07批api
//!
//! @brief 对象多选
//!
//! @param filterType
//! @param outputID
//! @return vfHRESULT
//!
VFAdapterAPI vfHRESULT vfSelectionToIDMore(const wchar_t *filterType,
                                           const char **&outputID);

VFAdapterAPI vfHRESULT vfAddCommentOnPoint(const char *SurfaceID, double x,
                                           double y, double z, BSTR Comment,
                                           int R, int G, int B, BSTR Font,
                                           double Size, const char *&CommentID);

VFAdapterAPI vfHRESULT vfDeleteCommentOnPoint(const char *PointID);
VFAdapterAPI vfHRESULT vfChangeSurfaceColorInsertMap(const char *Surfaces[],
                                                     int *R, int *G, int *B);
VFAdapterAPI vfHRESULT vfChangeSurfaceColorFromMap(const char *Surfaces[]);

VFAdapterAPI vfHRESULT
vfChangePointColorInsertMap(const char *inputStringValue[], int32_t colorR,
                            int32_t colorG, int32_t colorB);

VFAdapterAPI vfHRESULT
vfChangePointColorFromMap(const char *inputStringValue[]);

VFAdapterAPI vfHRESULT ClearPersistData();
/************************** 20250408批次API**********************************/

//!
//! @brief 返回CAD系统当前激活文档名称-零件名称(含扩展名，非完整路径)
//!
//! @param ActiveDocumentName
//! @return vfHRESULT
VFAdapterAPI vfHRESULT vfGetActiveDocumentName(BSTR &ActiveDocumentName);

//!
//! @brief 获取曲线的拆解子曲线数组
//!
//! @param CurveID
//! @param DismantlesID
//! @param LineOrCurve
//! @param length
//! @return vfHRESULT
VFAdapterAPI vfHRESULT vfDismantleCurve(const char *CurveID,
                                        const char **&DismantlesID,
                                        const char **&LineOrCurve, int &length);

//!
//! @brief 获取曲线起点和终点坐标值
//!
//! @param CurveID
//! @param Startx
//! @param Starty
//! @param Startz
//! @param Endx
//! @param Endy
//! @param Endz
//! @return vfHRESULT
VFAdapterAPI vfHRESULT vfGetCurveStartAndEndPointCoordinates(
    const char *CurveID, double &Startx, double &Starty, double &Startz,
    double &Endx, double &Endy, double &Endz);

//!
//! @brief 获取曲线上中间多个点坐标值，相邻两点之间具有相等的测地线长度
//!
//! @param CurveID
//! @param PointNums
//! @param X
//! @param Y
//! @param Z
//! @return vfHRESULT
VFAdapterAPI vfHRESULT vfGetEquidistantPointsOnCurve(const char *CurveID,
                                                     int PointNums, double *&X,
                                                     double *&Y, double *&Z);

//!
//! @brief 获取曲面外一点到面上最近点的坐标
//!
//! @param SurfaceID
//! @param X1
//! @param Y1
//! @param Z1
//! @param X2
//! @param Y2
//! @param Z2
//! @return vfHRESULT
VFAdapterAPI vfHRESULT vfGetMinimumDistancePointCoordinates(
    const char *SurfaceID, double X1, double Y1, double Z1, double &X2,
    double &Y2, double &Z2);

//!
//! @brief 绘制样条曲线
//!
//! @param SurfaceID
//! @param Name
//! @param Plane
//! @param length
//! @param PointCoordinate1
//! @param PointCoordinate2
//! @return vfHRESULT
VFAdapterAPI vfHRESULT vfCreateSpline2D(BSTR Name, int Plane, int length,
                                        double *PointCoordinate1,
                                        double *PointCoordinate2);

//!
//! @brief 获取点到面上最近点的坐标及其UV值
//!
//! @param SurfaceID
//! @param X1
//! @param Y1
//! @param Z1
//! @param X2
//! @param Y2
//! @param Z2
//! @param U
//! @param V
//! @return vfHRESULT
VFAdapterAPI vfHRESULT vfGetPointUVByCAA(const char *SurfaceID, double X1,
                                         double Y1, double Z1, double &X2,
                                         double &Y2, double &Z2, double &U,
                                         double &V);

//!
//! @brief 获取点到面上最近点的坐标及其UV值
//!
//! @param CurveID
//! @param PointNums
//! @param X
//! @param Y
//! @param Z
//! @return vfHRESULT
VFAdapterAPI vfHRESULT vfGetEquidistantPointsOnCurveRing(const char *CurveID,
                                                         int PointNums,
                                                         double *&X, double *&Y,
                                                         double *&Z);

/************************** 20250408批次API**********************************/

//!
//! @brief 据起点坐标和方向创建直线
//!
VFAdapterAPI vfHRESULT TGCreateLineStartDirection(double ptX, double ptY,
                                                  double ptZ, double dirX,
                                                  double dirY, double dirZ,
                                                  int64_t &lineID);

//!
//! @brief 据起点坐标和终点坐标创建直线
//!
VFAdapterAPI vfHRESULT TGCreateLineStartEnd(double ptX, double ptY, double ptZ,
                                            double dirX, double dirY,
                                            double dirZ, int64_t &lineID);

/*************
 20250515 批接口
 *************/

//!
//! @brief 偏置生成多条曲线及其ID
//!
//! @param SurfaceID
//! @param CurveID
//! @param Orientation
//! @param GeodesicDistances
//! @param OffsetCurves
//! @return vfHRESULT
//!
VFAdapterAPI vfHRESULT vfOffsetCurvesByParallel(
    const char *SurfaceID, const char *CurveID, double x, double y, double z,
    int DistanceNums, double *GeodesicDistances, BSTR GeometricSetName,
    BSTR *GeodesicCurvesName, const char **&OffsetCurves);

//!
//! @brief 批量删除曲线，一次刷新
//!
//! @param Curves
//! @return VFAdapterAPI
//!
VFAdapterAPI vfHRESULT vfDeleteCurves(const char *Curves[]);

//!
//! @brief 通过起点和终点偏置不同距离生成多条曲线
//!
//! @param SurfaceID
//! @param CurveID
//! @param Orientation
//! @param StartPointGeodesicDistances
//! @param EndPointGeodesicDistances
//! @param OffsetCurves
//! @return vfHRESULT
//!
VFAdapterAPI vfHRESULT vfOffsetCurveByStartPointAndEndPoint(
    const char *SurfaceID, const char *CurveID, const char *Orientation,
    double *StartPointGeodesicDistances, double *EndPointGeodesicDistances,
    const char **&OffsetCurves);

//!
//! @brief 在基准线对称偏置生成多条曲线
//!
//! @param SurfaceID
//! @param CurveID
//! @param GeodesicDistances
//! @param OffsetCurves
//! @return VFAdapterAPI
//!
VFAdapterAPI vfHRESULT vfOffsetCurvesBySymmetry(const char *SurfaceID,
                                                const char *CurveID,
                                                double *GeodesicDistances,
                                                const char **&OffsetCurves);

//!
//! @brief 起点和终点对称偏置不同距离生成多条曲线
//!
//! @param SurfaceID
//! @param CurveID
//! @param StartPointGeodesicDistances
//! @param EndPointGeodesicDistances
//! @param OffsetCurves
//! @return VFAdapterAPI
//!
VFAdapterAPI vfHRESULT vfOffsetCurveByStartPointAndEndPointBySymmetry(
    const char *SurfaceID, const char *CurveID,
    double *StartPointGeodesicDistances, double *EndPointGeodesicDistances,
    const char **&OffsetCurves);

//!
//! @brief 创建曲面上指定环的曲面
//!
//! @param Curves
//! @param Surface1
//! @param Surface2
//! @return VFAdapterAPI
//!
VFAdapterAPI vfHRESULT vfCreateSurfaceByFill(const char *Curves[],
                                             const char *Surface1,
                                             const char *&Surface2);
//!
//! @brief  批量删除曲面，一次刷新
//!
//! @param Surfaces
//! @return VFAdapterAPI
//!
VFAdapterAPI vfHRESULT vfDeleteSurfaces(const char *Surfaces[]);

//!
//! @brief 获取面上点的法向单位向量
//!
//! @param SurfaceID
//! @param CoodX
//! @param CoodY
//! @param CoodZ
//! @param bReverse
//! @param x
//! @param y
//! @param z
//! @return vfHRESULT
//!
VFAdapterAPI vfHRESULT vfGetUnitNormalVectorAtPoint2(const char *SurfaceID,
                                                     double CoodX, double CoodY,
                                                     double CoodZ,
                                                     bool bReverse, double &x,
                                                     double &y, double &z);

//!
//! @brief 批量删除实体，一次刷新
//!
//! @param entIds
//! @return VFAdapterAPI
//!
VFAdapterAPI vfHRESULT
TGBatchDeleteEntities(std::vector<int64_t> const &entIds);

/************************** 20250515批次API**********************************/
//!
//! @brief 在多条直线的某些端点增加或修剪某一长度
//! @param Curves
//! @param Surface
//! @param X
//! @param Y
//! @param Z
//! @param Offsetength
//! @return vfHRESULT
//!
VFAdapterAPI vfHRESULT vfTrimOrExtendCurvesFromEndPoint(const char *Curves[],
                                                        const char *Surface,
                                                        double *X, double *Y,
                                                        double *Z,
                                                        double *Offsetength);
//!
//! @brief 在多条面上直线的某些端点增加或修剪某一长度，无法超过面边界外
//! @param Curves
//! @param Surface
//! @param X
//! @param Y
//! @param Z
//! @param Offsetength
//! @return vfHRESULT
//!
VFAdapterAPI vfHRESULT vfTrimOrExtendCurvesFromEndPointOnSurface(
    const char *Curves[], const char *Surface, double *X, double *Y, double *Z,
    double *Offsetength);

//!
//! @brief 判断点与边界的位置关系
//!
//! @param BoundaryID
//! @param SurfaceID
//! @param x
//! @param y
//! @param z
//! @param result 点与边界的关系，result = 0为点在边界外，result
//! =1为点在边界内，result = 2为点在边界上
//! @return VFAdapterAPI
//!
VFAdapterAPI vfHRESULT vfTestPointAndBoundary(double x, double y, double z,
                                              const char *surfaceID,
                                              const char *BoundaryID,
                                              int &result);

//!
//! @brief 存储.db文件数据到part文件中
//!
//! @param dbPath
//! @return vfHRESULT
//!
VFAdapterAPI vfHRESULT vfDataTableSave(BSTR dbPath);

//!
//! @brief 提取part中的数据存入到.db文件
//!
//! @param dbPath
//! @return VFAdapterAPI
//!
VFAdapterAPI vfHRESULT vfDataTableRetrive(BSTR dbPath);

//!
//! @brief 在环内一点沿着某方向做线
//!
//! @param BoundaryID
//! @param SurfaceID
//! @param px
//! @param py
//! @param pz
//! @param dx
//! @param dy
//! @param dz
//! @param GeodesicCurveName
//! @param GeometricSetName
//! @return VFAdapterAPI
//!
VFAdapterAPI vfHRESULT vfCreatGeodesicCurvebyPoint(
    const char *BoundaryID, const char *SurfaceID, double px, double py,
    double pz, double dx, double dy, double dz, BSTR GeodesicCurveName,
    BSTR GeometricSetName, const char *&NewCurveID);

//!
//! @brief 提取点所在环ID
//!
//!
VFAdapterAPI vfHRESULT vfGetBoundaryIDbyDivide(const char *OriginalBoundaryID,
                                               const char *SurfaceID, double px,
                                               double py, double pz,
                                               const char *DivideCurve1ID,
                                               const char *DivideCurve2ID,
                                               const char *&NewBoundaryID);

//!
//! @brief 另存为stp文件
//!
//! @param StpName
//! @param StpPath
//! @return VFAdapterAPI
//!
VFAdapterAPI vfHRESULT vfSaveasStp(BSTR StpName, BSTR StpPath);

//!
//! @brief 提取点所在环ID（数组形式输入切割线）
//!
VFAdapterAPI vfHRESULT vfGetBoundaryIDbyPoint(const char *OriginalBoundaryID,
                                              const char *SurfaceID, double ptX,
                                              double ptY, double ptZ,
                                              const char *DivideCurveID[],
                                              const char *&NewBoundaryID,
                                              const char *&NewSurfaceID);

//!
//! @brief 创建线性剪口
//!
VFAdapterAPI vfHRESULT vfCreateSlitDart(const char *SurfaceID,
                                        const char *OriginalBoundaryID,
                                        double length, double ptX1, double ptY1,
                                        double ptZ1, double ptX2, double ptY2,
                                        double ptZ2,
                                        const char *&NewBoundaryID);

//!
//! @brief 创建V形剪口
//!
//!
VFAdapterAPI vfHRESULT vfCreateVShapeDart(const char *SurfaceID,
                                          const char *OriginalBoundaryID,
                                          double ptX1, double ptY1, double ptZ1,
                                          double ptX2, double ptY2, double ptZ2,
                                          double ptX3, double ptY3, double ptZ3,
                                          const char *&NewBoundaryID);

//!
//! @brief  创建3维截面
//!
//! @param strLaminateName 铺层名（将在其上执行截面的层压板。）
//! @param strCrossSectionCurve 截面曲线
//! @param strComponentType 要截的组件类型(铺层或层)
//! @param strBoundaryType
//! 边界类型(横截面是否会传播到铺层网络边界或扩展边界。)
//! @param strScaleType     缩放类型
//! @param dPlyOrLayerScale 层或铺层缩放比例
//! @param dCoreScale       芯缩放比例
//! @param strVisStyle      可视化样式
//! @param strVisProfileType 如何显示每一层，可以是线条或矩形。
//! @param dMinDistance     最小距离
//! @param dCorssSectionOffset 截面偏移
//! @param bCreateCrossSectionGeometry 创建截面几何
//! @param strOutputCurveType  创建输出曲线
//! @param bGeometryLocked  锁定几何
//! @param strDBPath  数据库路径
//! @return VFAdapterAPI
//!
VFAdapterAPI vfHRESULT VF2Create3Dsection(
    const char *strLaminateName, const char *strCrossSectionCurve,
    const char *strComponentType, const char *strBoundaryType,
    const char *strScaleType, double dPlyOrLayerScale, double dCoreScale,
    const char *strVisStyle, const char *strVisProfileType, double dMinDistance,
    double dCorssSectionOffset, bool bCreateCrossSectionGeometry,
    const char *strOutputCurveType, bool bGeometryLocked,
    const char *strDBPath);

/*******
2025.08.08接口
****/

//!
//! @brief  更改曲线颜色和线宽
//!
//! @param Lines
//! @param R
//! @param G
//! @param B
//! @param Linewidth
//! @return VFAdapterAPI
//!
VFAdapterAPI vfHRESULT vfChangeLinesColorAndWidth(const char *Lines[], int *R,
                                                  int *G, int *B,
                                                  double *Linewidth);

//!
//! @brief 获取曲线颜色和线宽
//!
//! @param Lines
//! @param R
//! @param G
//! @param B
//! @param Linewidth
//! @return VFAdapterAPI
//!
VFAdapterAPI vfHRESULT vfGetLinesColorAndWidth(const char *Lines[], int *&R,
                                               int *&G, int *&B,
                                               double *&Linewidth);

//!
//! @brief
//! 输入曲面ID、曲线ID、方向向量、偏置曲线的个数、偏置曲线所在几何图形集的名称、
//! 偏置曲线的名称数组和偏置测地距离数组，创建平行偏置曲线并返回所有平行偏置曲线的ID数组。
//! 特别要求(不裁剪，不延伸)
//! @param SurfaceID
//! @param CurveID
//! @param x
//! @param y
//! @param z
//! @param DistanceNums
//! @param GeometricSetName
//! @param GeodesicCurvesName
//! @param GeodesicDistances
//! @param OffsetCurves
//! @return VFAdapterAPI
//!
VFAdapterAPI vfHRESULT vfOffsetCurvesByParallel2(
    const char *SurfaceID, const char *CurveID, double x, double y, double z,
    int DistanceNums, double *GeodesicDistances, BSTR GeometricSetName,
    BSTR *GeodesicCurvesName, const char **&OffsetCurves);

//!
//! @brief
//!
//! @param Curve1ID
//! @param Curve2ID
//! @param result int& result：若重合则返回result = 1，不重合返回result =
//! 0，若输入的曲线不存在，则返回result = -1。
//! 注意：一条曲线属于另一个曲线的一部分不属于重合，判断精度根据各CAD内置精度定。
//! @return VFAdapterAPI
//!
VFAdapterAPI vfHRESULT vfTestCurvesCoincidence(const char *Curve1ID,
                                               const char *Curve2ID,
                                               int &result);

//!
//! @brief 把曲线的ID放进数组，不用排顺序，会自动首尾相接为一条曲线。
//!
//! @param OriginalCurves
//! @param JoinCurve
//! @return VFAdapterAPI
//!
VFAdapterAPI vfHRESULT vfCreateJoin(const char *OriginalCurves[],
                                    const char *&JoinCurve);

//! 删除临时对象(主要是临时显示对象)
VFAdapterAPI vfHRESULT vf2DeleteTemporaryObjects();

VFAdapterAPI vfHRESULT vf2Create3DNotes(
    const char *str3DNotesName, // 3维标注名
    const char *strLaminate,    // 层合板名
    const char *strRosette,     // Rosette名
    const char *strRefOrigin,   // 参考点
    bool bAnnotationLocked,     // 注释锁定
    const char *strBoundaryType, // 下拉框两个选项，”Net”/”Extended”
    const char *strAnnotationLeader, // 一个注释(天工不需要)
    const char *strSummaryInfo,   // 下拉框六个选项字符串 摘要格式
    const char *strComponentInfo, // 下拉框七个选项字符串 组成格式
    const char *strHeaderText,    // 表头文本
    const char *strColumnSeparator, // 列分隔符
    int iLinesPerColumn,            // 每列的行数
    bool
        bReverseSequence, // 翻转顺序(默认为false时，从小到大排序;从大到小排序时为true)
    const char *strDBPath);

// 9月10号批

//!
//! @brief 获取活动文档的路径
//!
//! @param ActiveDocumentPath
//! @return vfHRESULT
//!
VFAdapterAPI vfHRESULT vfGetActiveDocumentPath(BSTR &ActiveDocumentPath);

//!
//! @brief 获取当前活动文档的类型
//!
//! @param ActiveDocumentType
//! @return vfHRESULT
//!
VFAdapterAPI vfHRESULT vfGetActiveDocumentType(BSTR &ActiveDocumentType);

//!
//! @brief 点选并返回指定面上的指定个数坐标
//!
//! @param SurfaceID
//! @param PickNums
//! @param X
//! @param Y
//! @param Z
//! @return vfHRESULT 如取到了指定个数面上的点，则成功;其他情况为失败
//!
VFAdapterAPI vfHRESULT vfPickPointCoord(const char *SurfaceID, int PickNums,
                                        double *&X, double *&Y, double *&Z);

VFAdapterAPI vfHRESULT vfGetNewBoundary(const char *OriginalCurveID, double x,
                                        double y, double z,
                                        const char *DivideCurveID,
                                        const char *&NewBoundaryID);
VFAdapterAPI vfHRESULT vfSurfacesJointAndGetBoundary(
    const char *Surfaces[], const char *&NewBoundaryID);
VFAdapterAPI vfHRESULT vfTestCoincideSurface(const char *Surface1,
                                             const char *Surface2,
                                             const char *&CoincideLine,
                                             int &result);
VFAdapterAPI vfHRESULT vfGetPointDirSurfaceIntersections(
    const char *Surface, double Px, double Py, double Pz, double Dx, double Dy,
    double Dz, int &PointNumber, double *&X, double *&Y, double *&Z);

// 1014批

//!
//! @brief 1.创建V型剪口
//!
//! @param SurfaceID
//! @param OriginalBoundaryID
//! @param ptX1
//! @param ptY1
//! @param ptZ1
//! @param ptX2
//! @param ptY2
//! @param ptZ2
//! @param ptX3
//! @param ptY3
//! @param ptZ3
//! @param NewVshapeID
//! @return VFAdapterAPI
//!
VFAdapterAPI vfHRESULT vfCreateVShape(const char *SurfaceID,
                                      const char *OriginalBoundaryID,
                                      double ptX1, double ptY1, double ptZ1,
                                      double ptX2, double ptY2, double ptZ2,
                                      double ptX3, double ptY3, double ptZ3,
                                      const char *&NewVshapeID);
//!
//! @brief 获取剪口新边界的ID
//!
//! @param SurfaceID
//! @param OriginalBoundaryID
//! @param NewVshapeID
//! @param ptX1
//! @param ptY1
//! @param ptZ1
//! @param NewBoundaryID
//! @return VFAdapterAPI
//!
VFAdapterAPI vfHRESULT vfCreateNewDartBoundary(const char *SurfaceID,
                                               const char *OriginalBoundaryID,
                                               const char *NewVshapeID,
                                               double ptX1, double ptY1,
                                               double ptZ1,
                                               const char *&NewBoundaryID);
//!
//! @brief 2.起点和终点坐标值曲面ID，创建曲线并返回曲线ID
//!
//! @param X1
//! @param Y1
//! @param Z1
//! @param X2
//! @param Y2
//! @param Z2
//! @param SurfaceID
//! @param CurveID
//! @return VFAdapterAPI
//!
VFAdapterAPI vfHRESULT vfCreateCurveOnSurfaceByTwoPoints3(
    const double *X1, const double *Y1, const double *Z1, const double *X2,
    const double *Y2, const double *Z2, const char *SurfaceID,
    const char **&CurveID);

//!
//! @brief 3.曲线和环的位置关系
//!
//! @param SurfaceID
//! @param CurveRingID
//! @param CurveID
//! @param result
//! @return VFAdapterAPI
//!
VFAdapterAPI vfHRESULT vfTestCurveOnSurface(const char *SurfaceID,
                                            const char *CurveRingID,
                                            const char *CurveID, int &result);

//!
//! @brief 4.获取截线
//!
//! @param SurfaceID
//! @param CurveID
//! @param BoundaryID
//! @param SpliteCurveID
//! @return VFAdapterAPI
//!
VFAdapterAPI vfHRESULT vfCreateSpliteCurve(const char *SurfaceID,
                                           const char *CurveID,
                                           const char *BoundaryID,
                                           const char *&SpliteCurveID);

//!
//! @brief 给定点和一方向双向建线
//!
//! @param SurfaceID
//! @param LoopID
//! @param px
//! @param py
//! @param pz
//! @param dx
//! @param dy
//! @param dz
//! @param CurveID
//! @return VFAdapterAPI
//!
VFAdapterAPI vfHRESULT vfCreateCurveByBidirection(
    const char *SurfaceID, const char *LoopID, double px, double py, double pz,
    double dx, double dy, double dz, const char *&CurveID);

VFAdapterAPI vfHRESULT vfCreateLine(double x1, double y1, double z1, double x2,
                                    double y2, double z2, const char *&LineID);

//!
//! @brief 7.创建面接合
//!
//! @param Surfaces
//! @param NewSurfaceID
//! @return VFAdapterAPI
//!
VFAdapterAPI vfHRESULT vfSurfacesJoint(const char *Surfaces[],
                                       const char *&NewSurfaceID);

//!
//! @brief 判断点所在面的类型并获取母线方向向量
//!
//! @param SurfaceID
//! @param x1
//! @param y1
//! @param z1
//! @param x2
//! @param y2
//! @param z2
//! @param X
//! @param Y
//! @param Z
//! @param result
//! @return VFAdapterAPI
//! 曲面类型（圆柱面为1，圆锥面为2，平面为3，其他类型为0）；
//!
VFAdapterAPI vfHRESULT vfTestTypeOfSurfaceAndGetGeneratrixVector(
    const char *SurfaceID, double x1, double y1, double z1, double x2,
    double y2, double z2, double &X, double &Y, double &Z, int &result);

VFAdapterAPI vfHRESULT vfGetSurfaceBoundary();
VFAdapterAPI vfHRESULT vfImportDat();

VFAdapterAPI vfHRESULT vfCreateMBD(const TreeNode *rootNode1,
                                   const TreeNode *rootNode2);
}; // namespace VFAdapter

#endif
